'use strict';

/**
 * Test ip.js.
 */

const
    ip = require('../ip'),
    expect = require('chai').expect;

function isIp(addr, arr) {
    let loc = ip.find(addr);
    expect(loc).to.be.a('array');
    expect(JSON.stringify(loc)).to.equal(JSON.stringify(arr), `${addr} is not ${arr}?`);
}

describe('#ip', () => {

    it('find 1.x.x.x', async () => {
        isIp('1.1.1.1', ['APNIC', 'APNIC', '', '']);
        isIp('1.2.3.4', ['APNIC', 'APNIC', '', '']);
        isIp('1.11.22.33', ['韩国', '韩国', '', '']);
        isIp('32.0.0.0', ['欧盟', '欧盟', '', '']);
        isIp('120.144.0.0', ['澳大利亚', '澳大利亚', '', '']);
        isIp('197.32.0.0', ['埃及', '埃及', '', '']);
        isIp('5.136.0.0', ['俄罗斯', '俄罗斯', '', '']);
    });

    it('find 10.x.x.x', async () => {
        isIp('10.0.1.1', ['局域网', '局域网', '', '']);
        isIp('10.1.1.1', ['局域网', '局域网', '', '']);
        isIp('10.10.10.10', ['局域网', '局域网', '', '']);
    });

    it('find 192.168.x.x', async () => {
        isIp('192.168.0.1', ['局域网', '局域网', '', '']);
        isIp('192.168.1.1', ['局域网', '局域网', '', '']);
        isIp('192.168.10.10', ['局域网', '局域网', '', '']);
    });

    it('find usa', async () => {
        isIp('11.0.0.0', ['美国', '美国', '', '']);
        isIp('28.0.0.0', ['美国', '美国', '', '']);
        isIp('71.0.0.0', ['美国', '美国', '', '']);
        isIp('44.0.0.0', ['美国', '美国', '', '']);
        isIp('74.222.96.0', ['美国', '美国', '', '']);
        isIp('135.186.0.0', ['美国', '美国', '', '']);
        isIp('159.118.0.0', ['美国', '美国', '', '']);
        isIp('209.240.128.0', ['美国', '美国', '', '']);
    });

    it('find beijing', async () => {
        isIp('110.96.0.0', ['中国', '北京', '北京', '']);
        isIp('36.192.0.255', ['中国', '北京', '北京', '']);
        isIp('117.112.0.2', ['中国', '北京', '北京', '']);
        isIp('171.84.10.10', ['中国', '北京', '北京', '']);
        isIp('1.88.0.0', ['中国', '北京', '北京', '']);
        isIp('118.144.0.0', ['中国', '北京', '北京', '']);
        isIp('111.196.10.0', ['中国', '北京', '北京', '']);
        isIp('118.188.0.0', ['中国', '北京', '北京', '']);
        isIp('42.83.128.0', ['中国', '北京', '北京', '']);
        isIp('119.10.0.0', ['中国', '北京', '北京', '']);
        isIp('219.158.128.0', ['中国', '北京', '北京', '']);
        isIp('210.12.64.0', ['中国', '北京', '北京', '']);
        isIp('202.96.0.0', ['中国', '北京', '北京', '']);
        isIp('203.92.160.0', ['中国', '北京', '北京', '']);
        isIp('180.149.128.0', ['中国', '北京', '北京', '']);
        isIp('202.165.208.0', ['中国', '北京', '北京', '']);
        isIp('203.86.64.0', ['中国', '北京', '北京', '']);
        isIp('121.52.208.0', ['中国', '北京', '北京', '']);
    });

    it('find other', async () => {
        isIp('123.64.1.1', ['中国', '广东', '广州', '']);
        isIp('111.128.0.1', ['中国', '福建', '南平', '']);
        isIp('101.104.0.23', ['中国', '广东', '广州', '']);
        isIp('106.52.0.33', ['中国', '中国', '', '']);
        isIp('115.120.0.103', ['中国', '陕西', '西安', '']);
        isIp('1.116.0.1', ['中国', '中国', '', '']);
        isIp('220.154.0.1', ['中国', '中国', '', '']);
        isIp('211.81.0.0', ['中国', '天津', '天津', '']);
        isIp('223.201.0.0', ['中国', '中国', '', '']);
        isIp('114.215.0.0', ['中国', '山东', '青岛', '']);
        isIp('123.99.128.0', ['中国', '中国', '', '']);
        isIp('101.251.128.0', ['中国', '中国', '', '']);
        isIp('42.240.128.0', ['中国', '中国', '', '']);
        isIp('223.252.128.0', ['中国', '河南', '', '']);
        isIp('124.21.64.0', ['中国', '中国', '', '']);
        isIp('111.223.248.0', ['中国', '中国', '', '']);
        isIp('114.212.0.1', ['中国', '江苏', '南京', '']);
        isIp('202.119.128.0', ['中国', '江苏', '南京', '']);
        isIp('49.64.0.10', ['中国', '江苏', '苏州', '']);
        isIp('180.160.0.1', ['中国', '上海', '上海', '']);
        isIp('27.115.0.11', ['中国', '上海', '上海', '']);
        isIp('49.246.224.11', ['中国', '台湾', '', '']);
        isIp('202.97.96.1', ['中国', '香港', '', '']);
    });

    it('test speed', () => {
        // generate random ip:
        let
            addrs = [],
            randomIp = () => {
                return parseInt(Math.random() * 256) + '.' + parseInt(Math.random() * 256) + '.' + parseInt(Math.random() * 256) + '.' + parseInt(Math.random() * 256);
            };
        for (let i=0; i<10000; i++) {
            addrs.push(randomIp());
        }
        let start = Date.now();
        for (let addr of addrs) {
            ip.find(addr);
        }
        let last = Date.now() - start;
        console.log(`get 10000 ip address in ${last} ms.\n\n\n`);
    });
});
